package ar.com.ctrln.view.dashboard.compras.compra;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.EventQueue;
import org.zkoss.zk.ui.event.EventQueues;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Label;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Textbox;

import ar.com.ctrln.control.compras.compra.ConsultarCompra;
import ar.com.ctrln.persistence.model.compra.Compra;
import ar.com.ctrln.persistence.model.compra.PedidoCompra;
import ar.com.ctrln.view.ui.comportamientoVentana.AbstractMinimizarVentana;

@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class ConsultarComprasController extends AbstractMinimizarVentana {

	private static final long serialVersionUID = 7729776081089431884L;

	private Compra compra;

	private ListModelList<Compra> modelo;

	@WireVariable
	private ConsultarCompra consultarCompra;

	@Wire
	private Listbox lbCompras;

	private List<Compra> compras;

	@Wire
	private Button btnRecibirCompra;

	@Wire("#txtFilter")
	private Textbox txtFilter;

	@Wire
	private Label footer_label;

	@Wire
	private Checkbox chkFiltroCompras;

	@SuppressWarnings("rawtypes")
	private EventQueue actualizarListaCompras;

	@SuppressWarnings("rawtypes")
	Map args;

	@SuppressWarnings("unchecked")
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);

		actualizarListaCompras = EventQueues.lookup("actualizarListaCompras",
				EventQueues.DESKTOP, true);
		actualizarListaCompras.subscribe(new EventListener<Event>() {

			@Override
			public void onEvent(Event event) throws Exception {

				modelo.clear();

				compras = consultarCompra.listaCompras();

				modelo = new ListModelList<Compra>(compras);

				lbCompras.setModel(modelo);

				lbCompras.setMultiple(false);

				lbCompras.setCheckmark(false);

				lbCompras.setSelectedIndex(0);
			}
		});

		compras = consultarCompra.listaCompras();

		modelo = new ListModelList<Compra>(compras);

		lbCompras.setModel(modelo);

		lbCompras.setMultiple(false);

		lbCompras.setCheckmark(false);

		lbCompras.setSelectedIndex(0);
	}

	// @Listen("onClick = button[label='hello']")
	@SuppressWarnings({ "rawtypes", "unchecked" })
	@Listen("onClick = #btnVerCompra")
	public void verCompra(Event event) {
		compra = (Compra) lbCompras.getSelectedItem().getValue();
		if (compra != null) {
			args = new HashMap();
			args.put("data", compra);
			Executions.createComponents("/zul/compras/compras/verCompra.zul",
					null, args);
		}
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	@Listen("onClick = #btnRecibirCompra")
	public void recibirCompra(Event event) {

		compra = (Compra) lbCompras.getSelectedItem().getValue();

		if (!(compra.getEstado().equals(Compra.ESTADO_RECIVIDA) || compra
				.getEstado().equals(Compra.ESTADO_CANCELADA)) && compra != null) {
			args = new HashMap();
			args.put("data", compra);
			Executions.createComponents(
					"/zul/compras/compras/registrarRecepcion.zul", null, args);
		}
	}

	@Listen("onSelect = #lbCompras")
	public void colorearIcono(Event event) {

		Compra compra = (Compra) lbCompras.getSelectedItem().getValue();

		if (compra.getEstado().equals(Compra.ESTADO_RECIVIDA)
				|| compra.getEstado().equals(Compra.ESTADO_CANCELADA)) {
			btnRecibirCompra.setImage("/resources/icons/reciboTablaGris.png");
		} else {
			btnRecibirCompra.setImage("/resources/icons/reciboTabla2.png");
		}
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Listen("onChanging = #txtFilter")
	public void getFilter(Event event) {
		((Textbox) event.getTarget())
				.setValue(((org.zkoss.zk.ui.event.InputEvent) event).getValue());
		lbCompras.setModel(new ListModelList(getFilterBy(txtFilter.getValue(),
				modelo.getInnerList())));
		if (lbCompras.getItemCount() > 0) {
			footer_label.setValue("");
			footer_label.setValue("Un total de " + lbCompras.getItemCount()
					+ " Compras");
		} else {
			footer_label.setValue("Ningun Resultado...");
			footer_label.setValue("");
		}
		((Textbox) event.getTarget()).setFocus(true);
	}

	public static List<Compra> getFilterBy(String condicion,
			Collection<Compra> compras) {
		List<Compra> data = new ArrayList<Compra>();
		for (Iterator<Compra> i = compras.iterator(); i.hasNext();) {
			Compra tmp = i.next();
			if (tmp.getProveedor().getRazonSocial().toLowerCase()
					.indexOf(condicion.trim().toLowerCase()) >= 0
					|| tmp.getFormaPago().toLowerCase()
							.indexOf(condicion.trim().toLowerCase()) >= 0
					|| tmp.getFechaAlta().toString().toLowerCase()
							.indexOf(condicion.trim().toLowerCase()) >= 0) {
				data.add(tmp);
			}
		}
		return data;
	}

	@Listen("onClick = #chkFiltroCompras")
	public void quitarRecibidas(Event event) {
		List<Compra> data = new ArrayList<Compra>();
		modelo.clear();
		if (chkFiltroCompras.isChecked()) {
			for (Compra comp : compras) {
				if (!(comp.getEstado().equals(Compra.ESTADO_RECIVIDA) || comp
						.getEstado().equals(Compra.ESTADO_CANCELADA)))
					data.add(comp);
			}
			modelo.addAll(data);
		} else {
			modelo.addAll(compras);
		}
		lbCompras.setModel(modelo);
	}

}
